/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Control;

import Control.exceptions.NonexistentEntityException;
import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import Entidades.Categoria;
import Entidades.Empleado;
import Entidades.Selconfig;
import Entidades.Obrasocial;
import Entidades.Empleadoequipo;
import java.util.ArrayList;
import java.util.List;
import Entidades.Liquidacion;
import Entidades.Grupofamiliar;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

/**
 *
 * @author luksCastro
 */
public class EmpleadoJpaController implements Serializable {

    public EmpleadoJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Empleado empleado) {
        if (empleado.getEmpleadoequipoList() == null) {
            empleado.setEmpleadoequipoList(new ArrayList<Empleadoequipo>());
        }
        if (empleado.getLiquidacionList() == null) {
            empleado.setLiquidacionList(new ArrayList<Liquidacion>());
        }
        if (empleado.getGrupofamiliarList() == null) {
            empleado.setGrupofamiliarList(new ArrayList<Grupofamiliar>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Categoria categoriaidCategoria = empleado.getCategoriaidCategoria();
            if (categoriaidCategoria != null) {
                categoriaidCategoria = em.getReference(categoriaidCategoria.getClass(), categoriaidCategoria.getIdCategoria());
                empleado.setCategoriaidCategoria(categoriaidCategoria);
            }
            Selconfig SELConfigidSELConfig = empleado.getSELConfigidSELConfig();
            if (SELConfigidSELConfig != null) {
                SELConfigidSELConfig = em.getReference(SELConfigidSELConfig.getClass(), SELConfigidSELConfig.getIdSELConfig());
                empleado.setSELConfigidSELConfig(SELConfigidSELConfig);
            }
            Obrasocial obrasocialidObraSocial = empleado.getObrasocialidObraSocial();
            if (obrasocialidObraSocial != null) {
                obrasocialidObraSocial = em.getReference(obrasocialidObraSocial.getClass(), obrasocialidObraSocial.getIdObraSocial());
                empleado.setObrasocialidObraSocial(obrasocialidObraSocial);
            }
            List<Empleadoequipo> attachedEmpleadoequipoList = new ArrayList<Empleadoequipo>();
            for (Empleadoequipo empleadoequipoListEmpleadoequipoToAttach : empleado.getEmpleadoequipoList()) {
                empleadoequipoListEmpleadoequipoToAttach = em.getReference(empleadoequipoListEmpleadoequipoToAttach.getClass(), empleadoequipoListEmpleadoequipoToAttach.getIdEmpEq());
                attachedEmpleadoequipoList.add(empleadoequipoListEmpleadoequipoToAttach);
            }
            empleado.setEmpleadoequipoList(attachedEmpleadoequipoList);
            List<Liquidacion> attachedLiquidacionList = new ArrayList<Liquidacion>();
            for (Liquidacion liquidacionListLiquidacionToAttach : empleado.getLiquidacionList()) {
                liquidacionListLiquidacionToAttach = em.getReference(liquidacionListLiquidacionToAttach.getClass(), liquidacionListLiquidacionToAttach.getIdLiquidacion());
                attachedLiquidacionList.add(liquidacionListLiquidacionToAttach);
            }
            empleado.setLiquidacionList(attachedLiquidacionList);
            List<Grupofamiliar> attachedGrupofamiliarList = new ArrayList<Grupofamiliar>();
            for (Grupofamiliar grupofamiliarListGrupofamiliarToAttach : empleado.getGrupofamiliarList()) {
                grupofamiliarListGrupofamiliarToAttach = em.getReference(grupofamiliarListGrupofamiliarToAttach.getClass(), grupofamiliarListGrupofamiliarToAttach.getIdFamiliar());
                attachedGrupofamiliarList.add(grupofamiliarListGrupofamiliarToAttach);
            }
            empleado.setGrupofamiliarList(attachedGrupofamiliarList);
            em.persist(empleado);
            if (categoriaidCategoria != null) {
                categoriaidCategoria.getEmpleadoList().add(empleado);
                categoriaidCategoria = em.merge(categoriaidCategoria);
            }
            if (SELConfigidSELConfig != null) {
                SELConfigidSELConfig.getEmpleadoList().add(empleado);
                SELConfigidSELConfig = em.merge(SELConfigidSELConfig);
            }
            if (obrasocialidObraSocial != null) {
                obrasocialidObraSocial.getEmpleadoList().add(empleado);
                obrasocialidObraSocial = em.merge(obrasocialidObraSocial);
            }
            for (Empleadoequipo empleadoequipoListEmpleadoequipo : empleado.getEmpleadoequipoList()) {
                Empleado oldEmpleadoidEmpleadoOfEmpleadoequipoListEmpleadoequipo = empleadoequipoListEmpleadoequipo.getEmpleadoidEmpleado();
                empleadoequipoListEmpleadoequipo.setEmpleadoidEmpleado(empleado);
                empleadoequipoListEmpleadoequipo = em.merge(empleadoequipoListEmpleadoequipo);
                if (oldEmpleadoidEmpleadoOfEmpleadoequipoListEmpleadoequipo != null) {
                    oldEmpleadoidEmpleadoOfEmpleadoequipoListEmpleadoequipo.getEmpleadoequipoList().remove(empleadoequipoListEmpleadoequipo);
                    oldEmpleadoidEmpleadoOfEmpleadoequipoListEmpleadoequipo = em.merge(oldEmpleadoidEmpleadoOfEmpleadoequipoListEmpleadoequipo);
                }
            }
            for (Liquidacion liquidacionListLiquidacion : empleado.getLiquidacionList()) {
                Empleado oldEmpleadoidEmpleadoOfLiquidacionListLiquidacion = liquidacionListLiquidacion.getEmpleadoidEmpleado();
                liquidacionListLiquidacion.setEmpleadoidEmpleado(empleado);
                liquidacionListLiquidacion = em.merge(liquidacionListLiquidacion);
                if (oldEmpleadoidEmpleadoOfLiquidacionListLiquidacion != null) {
                    oldEmpleadoidEmpleadoOfLiquidacionListLiquidacion.getLiquidacionList().remove(liquidacionListLiquidacion);
                    oldEmpleadoidEmpleadoOfLiquidacionListLiquidacion = em.merge(oldEmpleadoidEmpleadoOfLiquidacionListLiquidacion);
                }
            }
            for (Grupofamiliar grupofamiliarListGrupofamiliar : empleado.getGrupofamiliarList()) {
                Empleado oldEmpleadoidEmpleadoOfGrupofamiliarListGrupofamiliar = grupofamiliarListGrupofamiliar.getEmpleadoidEmpleado();
                grupofamiliarListGrupofamiliar.setEmpleadoidEmpleado(empleado);
                grupofamiliarListGrupofamiliar = em.merge(grupofamiliarListGrupofamiliar);
                if (oldEmpleadoidEmpleadoOfGrupofamiliarListGrupofamiliar != null) {
                    oldEmpleadoidEmpleadoOfGrupofamiliarListGrupofamiliar.getGrupofamiliarList().remove(grupofamiliarListGrupofamiliar);
                    oldEmpleadoidEmpleadoOfGrupofamiliarListGrupofamiliar = em.merge(oldEmpleadoidEmpleadoOfGrupofamiliarListGrupofamiliar);
                }
            }
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Empleado empleado) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Empleado persistentEmpleado = em.find(Empleado.class, empleado.getIdEmpleado());
            Categoria categoriaidCategoriaOld = persistentEmpleado.getCategoriaidCategoria();
            Categoria categoriaidCategoriaNew = empleado.getCategoriaidCategoria();
            Selconfig SELConfigidSELConfigOld = persistentEmpleado.getSELConfigidSELConfig();
            Selconfig SELConfigidSELConfigNew = empleado.getSELConfigidSELConfig();
            Obrasocial obrasocialidObraSocialOld = persistentEmpleado.getObrasocialidObraSocial();
            Obrasocial obrasocialidObraSocialNew = empleado.getObrasocialidObraSocial();
            List<Empleadoequipo> empleadoequipoListOld = persistentEmpleado.getEmpleadoequipoList();
            List<Empleadoequipo> empleadoequipoListNew = empleado.getEmpleadoequipoList();
            List<Liquidacion> liquidacionListOld = persistentEmpleado.getLiquidacionList();
            List<Liquidacion> liquidacionListNew = empleado.getLiquidacionList();
            List<Grupofamiliar> grupofamiliarListOld = persistentEmpleado.getGrupofamiliarList();
            List<Grupofamiliar> grupofamiliarListNew = empleado.getGrupofamiliarList();
            if (categoriaidCategoriaNew != null) {
                categoriaidCategoriaNew = em.getReference(categoriaidCategoriaNew.getClass(), categoriaidCategoriaNew.getIdCategoria());
                empleado.setCategoriaidCategoria(categoriaidCategoriaNew);
            }
            if (SELConfigidSELConfigNew != null) {
                SELConfigidSELConfigNew = em.getReference(SELConfigidSELConfigNew.getClass(), SELConfigidSELConfigNew.getIdSELConfig());
                empleado.setSELConfigidSELConfig(SELConfigidSELConfigNew);
            }
            if (obrasocialidObraSocialNew != null) {
                obrasocialidObraSocialNew = em.getReference(obrasocialidObraSocialNew.getClass(), obrasocialidObraSocialNew.getIdObraSocial());
                empleado.setObrasocialidObraSocial(obrasocialidObraSocialNew);
            }
            List<Empleadoequipo> attachedEmpleadoequipoListNew = new ArrayList<Empleadoequipo>();
            for (Empleadoequipo empleadoequipoListNewEmpleadoequipoToAttach : empleadoequipoListNew) {
                empleadoequipoListNewEmpleadoequipoToAttach = em.getReference(empleadoequipoListNewEmpleadoequipoToAttach.getClass(), empleadoequipoListNewEmpleadoequipoToAttach.getIdEmpEq());
                attachedEmpleadoequipoListNew.add(empleadoequipoListNewEmpleadoequipoToAttach);
            }
            empleadoequipoListNew = attachedEmpleadoequipoListNew;
            empleado.setEmpleadoequipoList(empleadoequipoListNew);
            List<Liquidacion> attachedLiquidacionListNew = new ArrayList<Liquidacion>();
            for (Liquidacion liquidacionListNewLiquidacionToAttach : liquidacionListNew) {
                liquidacionListNewLiquidacionToAttach = em.getReference(liquidacionListNewLiquidacionToAttach.getClass(), liquidacionListNewLiquidacionToAttach.getIdLiquidacion());
                attachedLiquidacionListNew.add(liquidacionListNewLiquidacionToAttach);
            }
            liquidacionListNew = attachedLiquidacionListNew;
            empleado.setLiquidacionList(liquidacionListNew);
            List<Grupofamiliar> attachedGrupofamiliarListNew = new ArrayList<Grupofamiliar>();
            for (Grupofamiliar grupofamiliarListNewGrupofamiliarToAttach : grupofamiliarListNew) {
                grupofamiliarListNewGrupofamiliarToAttach = em.getReference(grupofamiliarListNewGrupofamiliarToAttach.getClass(), grupofamiliarListNewGrupofamiliarToAttach.getIdFamiliar());
                attachedGrupofamiliarListNew.add(grupofamiliarListNewGrupofamiliarToAttach);
            }
            grupofamiliarListNew = attachedGrupofamiliarListNew;
            empleado.setGrupofamiliarList(grupofamiliarListNew);
            empleado = em.merge(empleado);
            if (categoriaidCategoriaOld != null && !categoriaidCategoriaOld.equals(categoriaidCategoriaNew)) {
                categoriaidCategoriaOld.getEmpleadoList().remove(empleado);
                categoriaidCategoriaOld = em.merge(categoriaidCategoriaOld);
            }
            if (categoriaidCategoriaNew != null && !categoriaidCategoriaNew.equals(categoriaidCategoriaOld)) {
                categoriaidCategoriaNew.getEmpleadoList().add(empleado);
                categoriaidCategoriaNew = em.merge(categoriaidCategoriaNew);
            }
            if (SELConfigidSELConfigOld != null && !SELConfigidSELConfigOld.equals(SELConfigidSELConfigNew)) {
                SELConfigidSELConfigOld.getEmpleadoList().remove(empleado);
                SELConfigidSELConfigOld = em.merge(SELConfigidSELConfigOld);
            }
            if (SELConfigidSELConfigNew != null && !SELConfigidSELConfigNew.equals(SELConfigidSELConfigOld)) {
                SELConfigidSELConfigNew.getEmpleadoList().add(empleado);
                SELConfigidSELConfigNew = em.merge(SELConfigidSELConfigNew);
            }
            if (obrasocialidObraSocialOld != null && !obrasocialidObraSocialOld.equals(obrasocialidObraSocialNew)) {
                obrasocialidObraSocialOld.getEmpleadoList().remove(empleado);
                obrasocialidObraSocialOld = em.merge(obrasocialidObraSocialOld);
            }
            if (obrasocialidObraSocialNew != null && !obrasocialidObraSocialNew.equals(obrasocialidObraSocialOld)) {
                obrasocialidObraSocialNew.getEmpleadoList().add(empleado);
                obrasocialidObraSocialNew = em.merge(obrasocialidObraSocialNew);
            }
            for (Empleadoequipo empleadoequipoListOldEmpleadoequipo : empleadoequipoListOld) {
                if (!empleadoequipoListNew.contains(empleadoequipoListOldEmpleadoequipo)) {
                    empleadoequipoListOldEmpleadoequipo.setEmpleadoidEmpleado(null);
                    empleadoequipoListOldEmpleadoequipo = em.merge(empleadoequipoListOldEmpleadoequipo);
                }
            }
            for (Empleadoequipo empleadoequipoListNewEmpleadoequipo : empleadoequipoListNew) {
                if (!empleadoequipoListOld.contains(empleadoequipoListNewEmpleadoequipo)) {
                    Empleado oldEmpleadoidEmpleadoOfEmpleadoequipoListNewEmpleadoequipo = empleadoequipoListNewEmpleadoequipo.getEmpleadoidEmpleado();
                    empleadoequipoListNewEmpleadoequipo.setEmpleadoidEmpleado(empleado);
                    empleadoequipoListNewEmpleadoequipo = em.merge(empleadoequipoListNewEmpleadoequipo);
                    if (oldEmpleadoidEmpleadoOfEmpleadoequipoListNewEmpleadoequipo != null && !oldEmpleadoidEmpleadoOfEmpleadoequipoListNewEmpleadoequipo.equals(empleado)) {
                        oldEmpleadoidEmpleadoOfEmpleadoequipoListNewEmpleadoequipo.getEmpleadoequipoList().remove(empleadoequipoListNewEmpleadoequipo);
                        oldEmpleadoidEmpleadoOfEmpleadoequipoListNewEmpleadoequipo = em.merge(oldEmpleadoidEmpleadoOfEmpleadoequipoListNewEmpleadoequipo);
                    }
                }
            }
            for (Liquidacion liquidacionListOldLiquidacion : liquidacionListOld) {
                if (!liquidacionListNew.contains(liquidacionListOldLiquidacion)) {
                    liquidacionListOldLiquidacion.setEmpleadoidEmpleado(null);
                    liquidacionListOldLiquidacion = em.merge(liquidacionListOldLiquidacion);
                }
            }
            for (Liquidacion liquidacionListNewLiquidacion : liquidacionListNew) {
                if (!liquidacionListOld.contains(liquidacionListNewLiquidacion)) {
                    Empleado oldEmpleadoidEmpleadoOfLiquidacionListNewLiquidacion = liquidacionListNewLiquidacion.getEmpleadoidEmpleado();
                    liquidacionListNewLiquidacion.setEmpleadoidEmpleado(empleado);
                    liquidacionListNewLiquidacion = em.merge(liquidacionListNewLiquidacion);
                    if (oldEmpleadoidEmpleadoOfLiquidacionListNewLiquidacion != null && !oldEmpleadoidEmpleadoOfLiquidacionListNewLiquidacion.equals(empleado)) {
                        oldEmpleadoidEmpleadoOfLiquidacionListNewLiquidacion.getLiquidacionList().remove(liquidacionListNewLiquidacion);
                        oldEmpleadoidEmpleadoOfLiquidacionListNewLiquidacion = em.merge(oldEmpleadoidEmpleadoOfLiquidacionListNewLiquidacion);
                    }
                }
            }
            for (Grupofamiliar grupofamiliarListOldGrupofamiliar : grupofamiliarListOld) {
                if (!grupofamiliarListNew.contains(grupofamiliarListOldGrupofamiliar)) {
                    grupofamiliarListOldGrupofamiliar.setEmpleadoidEmpleado(null);
                    grupofamiliarListOldGrupofamiliar = em.merge(grupofamiliarListOldGrupofamiliar);
                }
            }
            for (Grupofamiliar grupofamiliarListNewGrupofamiliar : grupofamiliarListNew) {
                if (!grupofamiliarListOld.contains(grupofamiliarListNewGrupofamiliar)) {
                    Empleado oldEmpleadoidEmpleadoOfGrupofamiliarListNewGrupofamiliar = grupofamiliarListNewGrupofamiliar.getEmpleadoidEmpleado();
                    grupofamiliarListNewGrupofamiliar.setEmpleadoidEmpleado(empleado);
                    grupofamiliarListNewGrupofamiliar = em.merge(grupofamiliarListNewGrupofamiliar);
                    if (oldEmpleadoidEmpleadoOfGrupofamiliarListNewGrupofamiliar != null && !oldEmpleadoidEmpleadoOfGrupofamiliarListNewGrupofamiliar.equals(empleado)) {
                        oldEmpleadoidEmpleadoOfGrupofamiliarListNewGrupofamiliar.getGrupofamiliarList().remove(grupofamiliarListNewGrupofamiliar);
                        oldEmpleadoidEmpleadoOfGrupofamiliarListNewGrupofamiliar = em.merge(oldEmpleadoidEmpleadoOfGrupofamiliarListNewGrupofamiliar);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = empleado.getIdEmpleado();
                if (findEmpleado(id) == null) {
                    throw new NonexistentEntityException("The empleado with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Empleado empleado;
            try {
                empleado = em.getReference(Empleado.class, id);
                empleado.getIdEmpleado();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The empleado with id " + id + " no longer exists.", enfe);
            }
            Categoria categoriaidCategoria = empleado.getCategoriaidCategoria();
            if (categoriaidCategoria != null) {
                categoriaidCategoria.getEmpleadoList().remove(empleado);
                categoriaidCategoria = em.merge(categoriaidCategoria);
            }
            Selconfig SELConfigidSELConfig = empleado.getSELConfigidSELConfig();
            if (SELConfigidSELConfig != null) {
                SELConfigidSELConfig.getEmpleadoList().remove(empleado);
                SELConfigidSELConfig = em.merge(SELConfigidSELConfig);
            }
            Obrasocial obrasocialidObraSocial = empleado.getObrasocialidObraSocial();
            if (obrasocialidObraSocial != null) {
                obrasocialidObraSocial.getEmpleadoList().remove(empleado);
                obrasocialidObraSocial = em.merge(obrasocialidObraSocial);
            }
            List<Empleadoequipo> empleadoequipoList = empleado.getEmpleadoequipoList();
            for (Empleadoequipo empleadoequipoListEmpleadoequipo : empleadoequipoList) {
                empleadoequipoListEmpleadoequipo.setEmpleadoidEmpleado(null);
                empleadoequipoListEmpleadoequipo = em.merge(empleadoequipoListEmpleadoequipo);
            }
            List<Liquidacion> liquidacionList = empleado.getLiquidacionList();
            for (Liquidacion liquidacionListLiquidacion : liquidacionList) {
                liquidacionListLiquidacion.setEmpleadoidEmpleado(null);
                liquidacionListLiquidacion = em.merge(liquidacionListLiquidacion);
            }
            List<Grupofamiliar> grupofamiliarList = empleado.getGrupofamiliarList();
            for (Grupofamiliar grupofamiliarListGrupofamiliar : grupofamiliarList) {
                grupofamiliarListGrupofamiliar.setEmpleadoidEmpleado(null);
                grupofamiliarListGrupofamiliar = em.merge(grupofamiliarListGrupofamiliar);
            }
            em.remove(empleado);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Empleado> findEmpleadoEntities() {
        return findEmpleadoEntities(true, -1, -1);
    }

    public List<Empleado> findEmpleadoEntities(int maxResults, int firstResult) {
        return findEmpleadoEntities(false, maxResults, firstResult);
    }

    private List<Empleado> findEmpleadoEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select object(o) from Empleado as o");
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Empleado findEmpleado(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Empleado.class, id);
        } finally {
            em.close();
        }
    }

    public int getEmpleadoCount() {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select count(o) from Empleado as o");
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
